package com.wanwen.utils;

import java.util.Base64;
import java.util.Date;
import java.util.UUID;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtUtils {
	 // 定义有效时间长，以ms为单位
      private static long time =1000*60*60*2;  //2个小时
    // 签名信息(密钥)
    private static String signature = "admin";
    
    /**通过用户名获取token
     * @param username 用户名
     * @return
     */
    public static String getToken(String username) {
    	//获取到JWT的builder,builder就是用来获取JWT的对象
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwtToken = jwtBuilder
                // 设置头信息Header，头部
                    // 设置Token类型
                .setHeaderParam("typ","JWT")
                    // 设置算法名称
                .setHeaderParam("alg","HS256")
                // 设置载荷Payload，存放有效信息的地方
                    // 用户名
                .claim("username",username)
                    // 设置主题
                .setSubject("admin-test")
                    // 获取有效时间
                .setExpiration(new Date(System.currentTimeMillis()+time))
                    // 设置ID，就是JWT的ID
                .setId(UUID.randomUUID().toString())
                // 设置签名signature，对前面两部分的再次加密编码整合
                .signWith(SignatureAlgorithm.HS256,signature)
                // 将三部分进行拼接，形成有效的Token
                .compact();
             return jwtToken;
    }
    
    /**
     * 对Token进行解密
     * @param token 
     * @return
     */
    public static Claims parseToken(String token){
        // 运用Jwts.parser()对象
        JwtParser jwtParser = Jwts.parser();
        // 运用signature进行解密，拿到类似集合的返回对象
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return claims;
		/*
		 * System.out.println(claims.get("username"));
		 * System.out.println(claims.get("role")); System.out.println(claims.getId());
		 * System.out.println(claims.getSubject());
		 * System.out.println(claims.getExpiration());
		 */
    }
    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtils.signature);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    
}
